/**
* IceTabs Module for Joomla 1.6 By IceTheme
* 
* 
* @copyright	Copyright (C) 2008 - 2011 IceTheme.com. All rights reserved.
* @license		GNU General Public License version 2
* 
* @Website 	http://www.icetheme.com/Joomla-Extensions/icetabs.html
* @Support 	http://www.icetheme.com/Forums/IceTabs/
*
*/

if (typeof (IceSlideShow) == 'undefined') {
    var IceSlideShow = new Class({
        initialize: function(eMain, eNavigator, eNavOuter, options) {
            this.setting = $extend({
                autoStart: true,
                descStyle: 'sliding',
                mainItemSelector: 'div.lof-main-item',
                navSelector: 'li',
                navigatorEvent: 'click',
                interval: 2000,
                auto: false,
                navItemsDisplay: 3,
                startItem: 0,
                navItemHeight: 100,
                navItemWidth: 310
            }, options || {});

            this.currentNo = 0;
            this.nextNo = null;
            this.previousNo = null;
            this.fxItems = [];
            this.minSize = 0;
            this.onClick = false;
            if ($defined(eMain)) {
                this.slides = eMain.getElements(this.setting.mainItemSelector);
                this.maxWidth = eMain.getStyle('width').toInt();
                this.maxHeight = eMain.getStyle('height').toInt();
                this.styleMode = this.__getStyleMode();
                var fx = $extend({ waiting: false, onComplete: function() { this.onClick = false } .bind(this) }, this.setting.fxObject);
                this.slides.each(function(item, index) {
                    item.setStyles(eval('({"' + this.styleMode[0] + '": index * this.maxSize,"' + this.styleMode[1] + '":Math.abs(this.maxSize),"display" : "block"})'));
                    this.fxItems[index] = new Fx.Morph(item, fx);
                } .bind(this));
                if (this.styleMode[0] == 'opacity' || this.styleMode[0] == 'z-index') {
                    this.slides[0].setStyle(this.styleMode[0], '1');
                }
                eMain.addEvents({ 'mouseenter': this.stop.bind(this),
                    'mouseleave': function(e) {
                        if (this.setting.auto) {
                            this.play(this.setting.interval, 'next', true);
                        } 
                    } .bind(this)
                });
            }
            // if has the navigator
            if ($defined(eNavigator)) {
                this.navigatorItems = eNavigator.getElements(this.setting.navSelector);
                if (this.setting.navItemsDisplay > this.navigatorItems.length) {
                    this.setting.navItemsDisplay = this.navigatorItems.length;
                }

                if (this.setting.navPos == 'left' || this.setting.navPos == 'right')
                    eNavOuter.setStyles({ 'height': this.setting.navItemsDisplay * this.setting.navItemHeight, 'width': this.setting.navItemWidth });
                else
                    eNavOuter.setStyles({ 'height': this.setting.navItemHeight, 'width': this.setting.navItemsDisplay * this.setting.navItemWidth });
                this.navigatorFx = new Fx.Morph(eNavigator,
												{ transition: Fx.Transitions.Quad.easeInOut, duration: 800 });
                if (this.setting.auto) {
                    this.registerMousewheelHandler(eNavigator); // allow to use the srcoll
                }
                this.navigatorItems.each(function(item, index) {
                    item.addEvent(this.setting.navigatorEvent, function() {
                        this.jumping(index, true);
                        this.setNavActive(index, item);
                    } .bind(this));
                    item.setStyles({ 'height': this.setting.navItemHeight,
                        'width': this.setting.navItemWidth
                    });
                } .bind(this));
                this.setNavActive(0);
            }
        },
        navivationAnimate: function(currentIndex) {
            if (currentIndex <= this.setting.startItem
				|| currentIndex - this.setting.startItem >= this.setting.navItemsDisplay - 1) {
                this.setting.startItem = currentIndex - this.setting.navItemsDisplay + 2;
                if (this.setting.startItem < 0) this.setting.startItem = 0;
                if (this.setting.startItem > this.slides.length - this.setting.navItemsDisplay) {
                    this.setting.startItem = this.slides.length - this.setting.navItemsDisplay;
                }
            }
            //alert(this.setting.navPos);
            if (this.setting.navPos == 'left' || this.setting.navPos == 'right')
                this.navigatorFx.cancel().start({ 'top': -this.setting.startItem * this.setting.navItemHeight });
            else
                this.navigatorFx.cancel().start({ 'left': -this.setting.startItem * this.setting.navItemWidth });
        },
        setNavActive: function(index, item) {
            if ($defined(this.navigatorItems)) {
                this.navigatorItems.removeClass('active');
                this.navigatorItems[index].addClass('active');
                this.navivationAnimate(this.currentNo);
            }
        },
        __getStyleMode: function() {
            switch (this.setting.direction) {
                case 'opacity': this.maxSize = 0; this.minSize = 1; return ['opacity', 'opacity'];
                case 'vrup': this.maxSize = this.maxHeight; return ['top', 'height'];
                case 'vrdown': this.maxSize = -this.maxHeight; return ['top', 'height'];
                case 'hrright': this.maxSize = -this.maxWidth; return ['left', 'width'];
                case 'hrleft':
                default: this.maxSize = this.maxWidth; return ['left', 'width'];
            }
        },
        registerMousewheelHandler: function(element) {
            element.addEvent('mousewheel', function(e) {
                e.stop();
                if (e.wheel > 0) {
                    this.previous(true);
                } else {
                    this.next(true);
                }
            } .bind(this));
        },
        registerButtonsControl: function(eventHandler, objects, isHover) {
            if ($defined(objects) && this.slides.length > 1) {
                for (var action in objects) {
                    if ($defined(this[action.toString()]) && $defined(objects[action])) {
                        objects[action].addEvent(eventHandler, this[action.toString()].bind(this, [true]));
                    }
                }
            }
            return this;
        },
        start: function(isStart, obj) {
            this.setting.auto = isStart;
            // if use the preload image.
            if (obj) {
                var images = []
                this.slides.getElements('img').each(function(item, index) {
                    images[index] = item.getProperty('src');
                });
                var loader = new Asset.images(images, { onComplete: function() {
                    (function() { obj.fade('out'); }).delay(400);

                    if (isStart && this.slides.length > 0) { this.play(this.setting.interval, 'next', true); }
                } .bind(this)
                });
            } else {
                if (isStart && this.slides.length > 0) { this.play(this.setting.interval, 'next', true); }
            }
        },
        onProcessing: function(manual, start, end) {
            this.onClick = true;
            this.previousNo = this.currentNo + (this.currentNo > 0 ? -1 : this.slides.length - 1);
            this.nextNo = this.currentNo + (this.currentNo < this.slides.length - 1 ? 1 : 1 - this.slides.length);
            return this;
        },
        finishFx: function(manual) {
            if (manual) this.stop();
            if (manual && this.setting.auto) {
                this.play(this.setting.interval, 'next', true);
            }
            this.setNavActive(this.currentNo);
        },
        getObjectDirection: function(start, end) {
            return eval("({'" + this.styleMode[0] + "':[" + start + ", " + end + "]})");
        },
        fxStart: function(index, obj) {

            this.fxItems[index].cancel().start(obj);
            return this;
        },
        jumping: function(no, manual) {
            this.stop();
            if (this.currentNo == no) return;

            if ((no == this.currentNo - 1) && this.currentNo > 0) {
                this.onProcessing(null, manual, -this.maxWidth, this.minSize)
					.fxStart(this.currentNo, this.getObjectDirection(this.minSize, this.maxSize))
					.fxStart(no, this.getObjectDirection(-this.maxSize, this.minSize))
					.finishFx(manual);
            }
            else {
                this.onProcessing(null, manual, 0, this.maxSize)
					.fxStart(no, this.getObjectDirection(this.maxSize, this.minSize))
					.fxStart(this.currentNo, this.getObjectDirection(this.minSize, -this.maxSize))
					.finishFx(manual);
            }
            this.currentNo = no;
        },
        next: function(manual, item) {
            if (this.onClick) return;
            this.currentNo += (this.currentNo < this.slides.length - 1) ? 1 : (1 - this.slides.length);
            this.onProcessing(item, manual, 0, this.maxSize)
				.fxStart(this.currentNo, this.getObjectDirection(this.maxSize, this.minSize))
				.fxStart(this.previousNo, this.getObjectDirection(this.minSize, -this.maxSize))
				.finishFx(manual);
        },
        previous: function(manual, item) {
            if (this.onClick) return;
            this.currentNo += this.currentNo > 0 ? -1 : this.slides.length - 1;
            this.onProcessing(item, manual, -this.maxWidth, this.minSize)
				.fxStart(this.nextNo, this.getObjectDirection(this.minSize, this.maxSize))
				.fxStart(this.currentNo, this.getObjectDirection(-this.maxSize, this.minSize))
				.finishFx(manual);
        },
        play: function(delay, direction, wait) {
            this.stop();
            if (!wait) { this[direction](false); }
            this.isRun = this[direction].periodical(delay, this, true);
        }, stop: function() { ; $clear(this.isRun); }
    });
}